Code coverage report for src/module-analyzer.js

Statements: 17.78% (24 / 135)      Branches: 0% (0 / 79)      Functions: 52.63% (10 / 19)      Lines: 18.05% (24 / 133)      Ignored: none     

All files » src/ » module-analyzer.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 2601     1   1   1   1   16   1   2   6 6   1     1 1                     1                                                                   1                               1                                                                 1     1                                                               1 1           1       1                                                                                                                                                                               1     1        
System.register(['aurelia-metadata', 'aurelia-loader', 'aurelia-binding', './html-behavior', './view-strategy', './util'], function (_export) {
  'use strict';
 
  var Metadata, TemplateRegistryEntry, ValueConverterResource, HtmlBehaviorResource, ViewStrategy, TemplateRegistryViewStrategy, hyphenate, ResourceModule, ResourceDescription, ModuleAnalyzer;
 
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  return {
    setters: [function (_aureliaMetadata) {
      Metadata = _aureliaMetadata.Metadata;
    }, function (_aureliaLoader) {
      TemplateRegistryEntry = _aureliaLoader.TemplateRegistryEntry;
    }, function (_aureliaBinding) {
      ValueConverterResource = _aureliaBinding.ValueConverterResource;
    }, function (_htmlBehavior) {
      HtmlBehaviorResource = _htmlBehavior.HtmlBehaviorResource;
    }, function (_viewStrategy) {
      ViewStrategy = _viewStrategy.ViewStrategy;
      TemplateRegistryViewStrategy = _viewStrategy.TemplateRegistryViewStrategy;
    }, function (_util) {
      hyphenate = _util.hyphenate;
    }],
    execute: function () {
      ResourceModule = (function () {
        function ResourceModule(moduleId) {
          _classCallCheck(this, ResourceModule);
 
          this.id = moduleId;
          this.moduleInstance = null;
          this.mainResource = null;
          this.resources = null;
          this.viewStrategy = null;
          this.isAnalyzed = false;
        }
 
        ResourceModule.prototype.analyze = function analyze(container) {
          var current = this.mainResource,
              resources = this.resources,
              viewStrategy = this.viewStrategy,
              i,
              ii,
              metadata;
 
          if (this.isAnalyzed) {
            return;
          }
 
          this.isAnalyzed = true;
 
          if (current) {
            metadata = current.metadata;
            metadata.viewStrategy = viewStrategy;
 
            if ('analyze' in metadata) {
              metadata.analyze(container, current.value);
            }
          }
 
          for (i = 0, ii = resources.length; i < ii; ++i) {
            current = resources[i];
            metadata = current.metadata;
            metadata.viewStrategy = viewStrategy;
 
            if ('analyze' in metadata) {
              metadata.analyze(container, current.value);
            }
          }
        };
 
        ResourceModule.prototype.register = function register(registry, name) {
          var i,
              ii,
              resources = this.resources;
 
          if (this.mainResource) {
            this.mainResource.metadata.register(registry, name);
            name = null;
          }
 
          for (i = 0, ii = resources.length; i < ii; ++i) {
            resources[i].metadata.register(registry, name);
            name = null;
          }
        };
 
        ResourceModule.prototype.load = function load(container) {
          if (this.onLoaded) {
            return this.onLoaded;
          }
 
          var current = this.mainResource,
              resources = this.resources,
              i,
              ii,
              metadata,
              loads = [];
 
          if (current) {
            metadata = current.metadata;
 
            if ('load' in metadata) {
              loads.push(metadata.load(container, current.value));
            }
          }
 
          for (i = 0, ii = resources.length; i < ii; ++i) {
            current = resources[i];
            metadata = current.metadata;
 
            if ('load' in metadata) {
              loads.push(metadata.load(container, current.value));
            }
          }
 
          this.onLoaded = Promise.all(loads);
          return this.onLoaded;
        };
 
        return ResourceModule;
      })();
 
      ResourceDescription = function ResourceDescription(key, exportedValue, resourceTypeMeta) {
        _classCallCheck(this, ResourceDescription);
 
        if (!resourceTypeMeta) {
          resourceTypeMeta = Metadata.get(Metadata.resource, exportedValue);
 
          if (!resourceTypeMeta) {
            resourceTypeMeta = new HtmlBehaviorResource();
            resourceTypeMeta.elementName = hyphenate(key);
            Reflect.defineMetadata(Metadata.resource, resourceTypeMeta, exportedValue);
          }
        }
 
        if (resourceTypeMeta instanceof HtmlBehaviorResource) {
          if (resourceTypeMeta.elementName === undefined) {
            //customeElement()
            resourceTypeMeta.elementName = hyphenate(key);
          } else if (resourceTypeMeta.attributeName === undefined) {
            //customAttribute()
            resourceTypeMeta.attributeName = hyphenate(key);
          } else if (resourceTypeMeta.attributeName === null && resourceTypeMeta.elementName === null) {
            //no customeElement or customAttribute but behavior added by other metadata
            HtmlBehaviorResource.convention(key, resourceTypeMeta);
          }
        } else if (!resourceTypeMeta.name) {
          resourceTypeMeta.name = hyphenate(key);
        }
 
        this.metadata = resourceTypeMeta;
        this.value = exportedValue;
      };
 
      ModuleAnalyzer = (function () {
        function ModuleAnalyzer() {
          _classCallCheck(this, ModuleAnalyzer);
 
          this.cache = {};
        }
 
        ModuleAnalyzer.prototype.getAnalysis = function getAnalysis(moduleId) {
          return this.cache[moduleId];
        };
 
        ModuleAnalyzer.prototype.analyze = function analyze(moduleId, moduleInstance, viewModelMember) {
          var mainResource,
              fallbackValue,
              fallbackKey,
              resourceTypeMeta,
              key,
              exportedValue,
              resources = [],
              conventional,
              viewStrategy,
              resourceModule;
 
          resourceModule = this.cache[moduleId];
          if (resourceModule) {
            return resourceModule;
          }
 
          resourceModule = new ResourceModule(moduleId);
          this.cache[moduleId] = resourceModule;
 
          if (typeof moduleInstance === 'function') {
            moduleInstance = { 'default': moduleInstance };
          }
 
          if (viewModelMember) {
            mainResource = new ResourceDescription(viewModelMember, moduleInstance[viewModelMember]);
          }
 
          for (key in moduleInstance) {
            exportedValue = moduleInstance[key];
 
            if (key === viewModelMember || typeof exportedValue !== 'function') {
              continue;
            }
 
            resourceTypeMeta = Metadata.get(Metadata.resource, exportedValue);
 
            if (resourceTypeMeta) {
              if (resourceTypeMeta.attributeName === null && resourceTypeMeta.elementName === null) {
                //no customeElement or customAttribute but behavior added by other metadata
                HtmlBehaviorResource.convention(key, resourceTypeMeta);
              }
 
              if (resourceTypeMeta.attributeName === null && resourceTypeMeta.elementName === null) {
                //no convention and no customeElement or customAttribute but behavior added by other metadata
                resourceTypeMeta.elementName = hyphenate(key);
              }
 
              if (!mainResource && resourceTypeMeta instanceof HtmlBehaviorResource && resourceTypeMeta.elementName !== null) {
                mainResource = new ResourceDescription(key, exportedValue, resourceTypeMeta);
              } else {
                resources.push(new ResourceDescription(key, exportedValue, resourceTypeMeta));
              }
            } else if (exportedValue instanceof ViewStrategy) {
              viewStrategy = exportedValue;
            } else if (exportedValue instanceof TemplateRegistryEntry) {
              viewStrategy = new TemplateRegistryViewStrategy(moduleId, exportedValue);
            } else {
              if (conventional = HtmlBehaviorResource.convention(key)) {
                if (conventional.elementName !== null && !mainResource) {
                  mainResource = new ResourceDescription(key, exportedValue, conventional);
                } else {
                  resources.push(new ResourceDescription(key, exportedValue, conventional));
                }
 
                Reflect.defineMetadata(Metadata.resource, conventional, exportedValue);
              } else if (conventional = ValueConverterResource.convention(key)) {
                resources.push(new ResourceDescription(key, exportedValue, conventional));
                Reflect.defineMetadata(Metadata.resource, conventional, exportedValue);
              } else if (!fallbackValue) {
                fallbackValue = exportedValue;
                fallbackKey = key;
              }
            }
          }
 
          if (!mainResource && fallbackValue) {
            mainResource = new ResourceDescription(fallbackKey, fallbackValue);
          }
 
          resourceModule.moduleInstance = moduleInstance;
          resourceModule.mainResource = mainResource;
          resourceModule.resources = resources;
          resourceModule.viewStrategy = viewStrategy;
 
          return resourceModule;
        };
 
        return ModuleAnalyzer;
      })();
 
      _export('ModuleAnalyzer', ModuleAnalyzer);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL21vZHVsZS1hbmFseXplci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7NElBT00sY0FBYyxFQXVGZCxtQkFBbUIsRUFnQ1osY0FBYzs7Ozs7O2tDQTlIbkIsUUFBUTs7NkNBQ1IscUJBQXFCOzsrQ0FDckIsc0JBQXNCOzsyQ0FDdEIsb0JBQW9COzttQ0FDcEIsWUFBWTttREFBQyw0QkFBNEI7O3dCQUN6QyxTQUFTOzs7QUFFWCxvQkFBYztBQUNQLGlCQURQLGNBQWMsQ0FDTixRQUFRLEVBQUM7Z0NBRGpCLGNBQWM7O0FBRWhCLGNBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDO0FBQ25CLGNBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzNCLGNBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLGNBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLGNBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLGNBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1NBQ3pCOztBQVJHLHNCQUFjLFdBVWxCLE9BQU8sR0FBQSxpQkFBQyxTQUFTLEVBQUM7QUFDaEIsY0FBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVk7Y0FDM0IsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTO2NBQzFCLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWTtjQUNoQyxDQUFDO2NBQUUsRUFBRTtjQUFFLFFBQVEsQ0FBQzs7QUFFcEIsY0FBRyxJQUFJLENBQUMsVUFBVSxFQUFDO0FBQ2pCLG1CQUFPO1dBQ1I7O0FBRUQsY0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7O0FBRXZCLGNBQUcsT0FBTyxFQUFDO0FBQ1Qsb0JBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQzVCLG9C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IiwiZmlsZSI6Ii9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL21vZHVsZS1hbmFseXplci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TWV0YWRhdGF9IGZyb20gJ2F1cmVsaWEtbWV0YWRhdGEnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZ2lzdHJ5RW50cnl9IGZyb20gJ2F1cmVsaWEtbG9hZGVyJztcbmltcG9ydCB7VmFsdWVDb252ZXJ0ZXJSZXNvdXJjZX0gZnJvbSAnYXVyZWxpYS1iaW5kaW5nJztcbmltcG9ydCB7SHRtbEJlaGF2aW9yUmVzb3VyY2V9IGZyb20gJy4vaHRtbC1iZWhhdmlvcic7XG5pbXBvcnQge1ZpZXdTdHJhdGVneSxUZW1wbGF0ZVJlZ2lzdHJ5Vmlld1N0cmF0ZWd5fSBmcm9tICcuL3ZpZXctc3RyYXRlZ3knO1xuaW1wb3J0IHtoeXBoZW5hdGV9IGZyb20gJy4vdXRpbCc7XG5cbmNsYXNzIFJlc291cmNlTW9kdWxlIHtcbiAgY29uc3RydWN0b3IobW9kdWxlSWQpe1xuICAgIHRoaXMuaWQgPSBtb2R1bGVJZDtcbiAgICB0aGlzLm1vZHVsZUluc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLm1haW5SZXNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5yZXNvdXJjZXMgPSBudWxsO1xuICAgIHRoaXMudmlld1N0cmF0ZWd5ID0gbnVsbDtcbiAgICB0aGlzLmlzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGFuYWx5emUoY29udGFpbmVyKXtcbiAgICB2YXIgY3VycmVudCA9IHRoaXMubWFpblJlc291cmNlLFxuICAgICAgICByZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlcyxcbiAgICAgICAgdmlld1N0cmF0ZWd5ID0gdGhpcy52aWV3U3RyYXRlZ3ksXG4gICAgICAgIGksIGlpLCBtZXRhZGF0YTtcblxuICAgIGlmKHRoaXMuaXNBbmFseXplZCl7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgIGlmKGN1cnJlbnQpe1xuICAgICAgbWV0YWRhdGEgPSBjdXJyZW50Lm1ldGFkYXRhO1xuICAgICAgbWV0YWRhdGEudmlld1N0cmF0ZWd5ID0gdmlld1N0cmF0ZWd5O1xuXG4gICAgICBpZignYW5hbHl6ZScgaW4gbWV0YWRhdGEpe1xuICAgICAgICBtZXRhZGF0YS5hbmFseXplKGNvbnRhaW5lciwgY3VycmVudC52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yKGkgPSAwLCBpaSA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBpaTsgKytpKXtcbiAgICAgIGN1cnJlbnQgPSByZXNvdXJjZXNbaV07XG4gICAgICBtZXRhZGF0YSA9IGN1cnJlbnQubWV0YWRhdGE7XG4gICAgICBtZXRhZGF0YS52aWV3U3RyYXRlZ3kgPSB2aWV3U3RyYXRlZ3k7XG5cbiAgICAgIGlmKCdhbmFseXplJyBpbiBtZXRhZGF0YSl7XG4gICAgICAgIG1ldGFkYXRhLmFuYWx5emUoY29udGFpbmVyLCBjdXJyZW50LnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZWdpc3RlcihyZWdpc3RyeSwgbmFtZSl7XG4gICAgdmFyIGksIGlpLCByZXNvdXJjZXMgPSB0aGlzLnJlc291cmNlcztcblxuICAgIGlmKHRoaXMubWFpblJlc291cmNlKXtcbiAgICAgIHRoaXMubWFpblJlc291cmNlLm1ldGFkYXRhLnJlZ2lzdGVyKHJlZ2lzdHJ5LCBuYW1lKTtcbiAgICAgIG5hbWUgPSBudWxsO1xuICAgIH1cblxuICAgIGZvcihpID0gMCwgaWkgPSByZXNvdXJjZXMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICByZXNvdXJjZXNbaV0ubWV0YWRhdGEucmVnaXN0ZXIocmVnaXN0cnksIG5hbWUpO1xuICAgICAgbmFtZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgbG9hZChjb250YWluZXIpe1xuICAgIGlmKHRoaXMub25Mb2FkZWQpe1xuICAgICAgcmV0dXJuIHRoaXMub25Mb2FkZWQ7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSB0aGlzLm1haW5SZXNvdXJjZSxcbiAgICAgICAgcmVzb3VyY2VzID0gdGhpcy5yZXNvdXJjZXMsXG4gICAgICAgIGksIGlpLCBtZXRhZGF0YSwgbG9hZHMgPSBbXTtcblxuICAgIGlmKGN1cnJlbnQpe1xuICAgICAgbWV0YWRhdGEgPSBjdXJyZW50Lm1ldGFkYXRhO1xuXG4gICAgICBpZignbG9hZCcgaW4gbWV0YWRhdGEpe1xuICAgICAgICBsb2Fkcy5wdXNoKG1ldGFkYXRhLmxvYWQoY29udGFpbmVyLCBjdXJyZW50LnZhbHVlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yKGkgPSAwLCBpaSA9IHJlc291cmNlcy5sZW5ndGg7IGkgPCBpaTsgKytpKXtcbiAgICAgIGN1cnJlbnQgPSByZXNvdXJjZXNbaV07XG4gICAgICBtZXRhZGF0YSA9IGN1cnJlbnQubWV0YWRhdGE7XG5cbiAgICAgIGlmKCdsb2FkJyBpbiBtZXRhZGF0YSl7XG4gICAgICAgIGxvYWRzLnB1c2gobWV0YWRhdGEubG9hZChjb250YWluZXIsIGN1cnJlbnQudmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9uTG9hZGVkID0gUHJvbWlzZS5hbGwobG9hZHMpO1xuICAgIHJldHVybiB0aGlzLm9uTG9hZGVkO1xuICB9XG59XG5cbmNsYXNzIFJlc291cmNlRGVzY3JpcHRpb24ge1xuICBjb25zdHJ1Y3RvcihrZXksIGV4cG9ydGVkVmFsdWUsIHJlc291cmNlVHlwZU1ldGEpe1xuICAgIGlmKCFyZXNvdXJjZVR5cGVNZXRhKXtcbiAgICAgIHJlc291cmNlVHlwZU1ldGEgPSBNZXRhZGF0YS5nZXQoTWV0YWRhdGEucmVzb3VyY2UsIGV4cG9ydGVkVmFsdWUpO1xuXG4gICAgICBpZighcmVzb3VyY2VUeXBlTWV0YSl7XG4gICAgICAgIHJlc291cmNlVHlwZU1ldGEgPSBuZXcgSHRtbEJlaGF2aW9yUmVzb3VyY2UoKTtcbiAgICAgICAgcmVzb3VyY2VUeXBlTWV0YS5lbGVtZW50TmFtZSA9IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKE1ldGFkYXRhLnJlc291cmNlLCByZXNvdXJjZVR5cGVNZXRhLCBleHBvcnRlZFZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZihyZXNvdXJjZVR5cGVNZXRhIGluc3RhbmNlb2YgSHRtbEJlaGF2aW9yUmVzb3VyY2Upe1xuICAgICAgaWYocmVzb3VyY2VUeXBlTWV0YS5lbGVtZW50TmFtZSA9PT0gdW5kZWZpbmVkKXtcbiAgICAgICAgLy9jdXN0b21lRWxlbWVudCgpXG4gICAgICAgIHJlc291cmNlVHlwZU1ldGEuZWxlbWVudE5hbWUgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIH0gZWxzZSBpZihyZXNvdXJjZVR5cGVNZXRhLmF0dHJpYnV0ZU5hbWUgPT09IHVuZGVmaW5lZCl7XG4gICAgICAgIC8vY3VzdG9tQXR0cmlidXRlKClcbiAgICAgICAgcmVzb3VyY2VUeXBlTWV0YS5hdHRyaWJ1dGVOYW1lID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICB9IGVsc2UgaWYocmVzb3VyY2VUeXBlTWV0YS5hdHRyaWJ1dGVOYW1lID09PSBudWxsICYmIHJlc291cmNlVHlwZU1ldGEuZWxlbWVudE5hbWUgPT09IG51bGwpe1xuICAgICAgICAvL25vIGN1c3RvbWVFbGVtZW50IG9yIGN1c3RvbUF0dHJpYnV0ZSBidXQgYmVoYXZpb3IgYWRkZWQgYnkgb3RoZXIgbWV0YWRhdGFcbiAgICAgICAgSHRtbEJlaGF2aW9yUmVzb3VyY2UuY29udmVudGlvbihrZXksIHJlc291cmNlVHlwZU1ldGEpO1xuICAgICAgfVxuICAgIH1lbHNlIGlmKCFyZXNvdXJjZVR5cGVNZXRhLm5hbWUpe1xuICAgICAgcmVzb3VyY2VUeXBlTWV0YS5uYW1lID0gaHlwaGVuYXRlKGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5tZXRhZGF0YSA9IHJlc291cmNlVHlwZU1ldGE7XG4gICAgdGhpcy52YWx1ZSA9IGV4cG9ydGVkVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vZHVsZUFuYWx5emVyIHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLmNhY2hlID0ge307XG4gIH1cblxuICBnZXRBbmFseXNpcyhtb2R1bGVJZCl7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVbbW9kdWxlSWRdO1xuICB9XG5cbiAgYW5hbHl6ZShtb2R1bGVJZCwgbW9kdWxlSW5zdGFuY2UsIHZpZXdNb2RlbE1lbWJlcil7XG4gICAgdmFyIG1haW5SZXNvdXJjZSwgZmFsbGJhY2tWYWx1ZSwgZmFsbGJhY2tLZXksIHJlc291cmNlVHlwZU1ldGEsIGtleSxcbiAgICAgICAgZXhwb3J0ZWRWYWx1ZSwgcmVzb3VyY2VzID0gW10sIGNvbnZlbnRpb25hbCwgdmlld1N0cmF0ZWd5LCByZXNvdXJjZU1vZHVsZTtcblxuICAgIHJlc291cmNlTW9kdWxlID0gdGhpcy5jYWNoZVttb2R1bGVJZF07XG4gICAgaWYocmVzb3VyY2VNb2R1bGUpe1xuICAgICAgcmV0dXJuIHJlc291cmNlTW9kdWxlO1xuICAgIH1cblxuICAgIHJlc291cmNlTW9kdWxlID0gbmV3IFJlc291cmNlTW9kdWxlKG1vZHVsZUlkKTtcbiAgICB0aGlzLmNhY2hlW21vZHVsZUlkXSA9IHJlc291cmNlTW9kdWxlO1xuXG4gICAgaWYodHlwZW9mIG1vZHVsZUluc3RhbmNlID09PSAnZnVuY3Rpb24nKXtcbiAgICAgIG1vZHVsZUluc3RhbmNlID0geydkZWZhdWx0JzogbW9kdWxlSW5zdGFuY2V9O1xuICAgIH1cblxuICAgIGlmKHZpZXdNb2RlbE1lbWJlcil7XG4gICAgICBtYWluUmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VEZXNjcmlwdGlvbih2aWV3TW9kZWxNZW1iZXIsIG1vZHVsZUluc3RhbmNlW3ZpZXdNb2RlbE1lbWJlcl0pO1xuICAgIH1cblxuICAgIGZvcihrZXkgaW4gbW9kdWxlSW5zdGFuY2Upe1xuICAgICAgZXhwb3J0ZWRWYWx1ZSA9IG1vZHVsZUluc3RhbmNlW2tleV07XG5cbiAgICAgIGlmKGtleSA9PT0gdmlld01vZGVsTWVtYmVyIHx8IHR5cGVvZiBleHBvcnRlZFZhbHVlICE9PSAnZnVuY3Rpb24nKXtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJlc291cmNlVHlwZU1ldGEgPSBNZXRhZGF0YS5nZXQoTWV0YWRhdGEucmVzb3VyY2UsIGV4cG9ydGVkVmFsdWUpO1xuXG4gICAgICBpZihyZXNvdXJjZVR5cGVNZXRhKXtcbiAgICAgICAgaWYocmVzb3VyY2VUeXBlTWV0YS5hdHRyaWJ1dGVOYW1lID09PSBudWxsICYmIHJlc291cmNlVHlwZU1ldGEuZWxlbWVudE5hbWUgPT09IG51bGwpe1xuICAgICAgICAgIC8vbm8gY3VzdG9tZUVsZW1lbnQgb3IgY3VzdG9tQXR0cmlidXRlIGJ1dCBiZWhhdmlvciBhZGRlZCBieSBvdGhlciBtZXRhZGF0YVxuICAgICAgICAgIEh0bWxCZWhhdmlvclJlc291cmNlLmNvbnZlbnRpb24oa2V5LCByZXNvdXJjZVR5cGVNZXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKHJlc291cmNlVHlwZU1ldGEuYXR0cmlidXRlTmFtZSA9PT0gbnVsbCAmJiByZXNvdXJjZVR5cGVNZXRhLmVsZW1lbnROYW1lID09PSBudWxsKXtcbiAgICAgICAgICAvL25vIGNvbnZlbnRpb24gYW5kIG5vIGN1c3RvbWVFbGVtZW50IG9yIGN1c3RvbUF0dHJpYnV0ZSBidXQgYmVoYXZpb3IgYWRkZWQgYnkgb3RoZXIgbWV0YWRhdGFcbiAgICAgICAgICByZXNvdXJjZVR5cGVNZXRhLmVsZW1lbnROYW1lID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZighbWFpblJlc291cmNlICYmIHJlc291cmNlVHlwZU1ldGEgaW5zdGFuY2VvZiBIdG1sQmVoYXZpb3JSZXNvdXJjZSAmJiByZXNvdXJjZVR5cGVNZXRhLmVsZW1lbnROYW1lICE9PSBudWxsKXtcbiAgICAgICAgICBtYWluUmVzb3VyY2UgPSBuZXcgUmVzb3VyY2VEZXNjcmlwdGlvbihrZXksIGV4cG9ydGVkVmFsdWUsIHJlc291cmNlVHlwZU1ldGEpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICByZXNvdXJjZXMucHVzaChuZXcgUmVzb3VyY2VEZXNjcmlwdGlvbihrZXksIGV4cG9ydGVkVmFsdWUsIHJlc291cmNlVHlwZU1ldGEpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKGV4cG9ydGVkVmFsdWUgaW5zdGFuY2VvZiBWaWV3U3RyYXRlZ3kpe1xuICAgICAgICB2aWV3U3RyYXRlZ3kgPSBleHBvcnRlZFZhbHVlO1xuICAgICAgfSBlbHNlIGlmKGV4cG9ydGVkVmFsdWUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZ2lzdHJ5RW50cnkpe1xuICAgICAgICB2aWV3U3RyYXRlZ3kgPSBuZXcgVGVtcGxhdGVSZWdpc3RyeVZpZXdTdHJhdGVneShtb2R1bGVJZCwgZXhwb3J0ZWRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZihjb252ZW50aW9uYWwgPSBIdG1sQmVoYXZpb3JSZXNvdXJjZS5jb252ZW50aW9uKGtleSkpe1xuICAgICAgICAgIGlmKGNvbnZlbnRpb25hbC5lbGVtZW50TmFtZSAhPT0gbnVsbCAmJiAhbWFpblJlc291cmNlKXtcbiAgICAgICAgICAgIG1haW5SZXNvdXJjZSA9IG5ldyBSZXNvdXJjZURlc2NyaXB0aW9uKGtleSwgZXhwb3J0ZWRWYWx1ZSwgY29udmVudGlvbmFsKTtcbiAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJlc291cmNlcy5wdXNoKG5ldyBSZXNvdXJjZURlc2NyaXB0aW9uKGtleSwgZXhwb3J0ZWRWYWx1ZSwgY29udmVudGlvbmFsKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShNZXRhZGF0YS5yZXNvdXJjZSwgY29udmVudGlvbmFsLCBleHBvcnRlZFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmKGNvbnZlbnRpb25hbCA9IFZhbHVlQ29udmVydGVyUmVzb3VyY2UuY29udmVudGlvbihrZXkpKSB7XG4gICAgICAgICAgcmVzb3VyY2VzLnB1c2gobmV3IFJlc291cmNlRGVzY3JpcHRpb24oa2V5LCBleHBvcnRlZFZhbHVlLCBjb252ZW50aW9uYWwpKTtcbiAgICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKE1ldGFkYXRhLnJlc291cmNlLCBjb252ZW50aW9uYWwsIGV4cG9ydGVkVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYoIWZhbGxiYWNrVmFsdWUpe1xuICAgICAgICAgIGZhbGxiYWNrVmFsdWUgPSBleHBvcnRlZFZhbHVlO1xuICAgICAgICAgIGZhbGxiYWNrS2V5ID0ga2V5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoIW1haW5SZXNvdXJjZSAmJiBmYWxsYmFja1ZhbHVlKXtcbiAgICAgIG1haW5SZXNvdXJjZSA9IG5ldyBSZXNvdXJjZURlc2NyaXB0aW9uKGZhbGxiYWNrS2V5LCBmYWxsYmFja1ZhbHVlKTtcbiAgICB9XG5cbiAgICByZXNvdXJjZU1vZHVsZS5tb2R1bGVJbnN0YW5jZSA9IG1vZHVsZUluc3RhbmNlO1xuICAgIHJlc291cmNlTW9kdWxlLm1haW5SZXNvdXJjZSA9IG1haW5SZXNvdXJjZTtcbiAgICByZXNvdXJjZU1vZHVsZS5yZXNvdXJjZXMgPSByZXNvdXJjZXM7XG4gICAgcmVzb3VyY2VNb2R1bGUudmlld1N0cmF0ZWd5ID0gdmlld1N0cmF0ZWd5O1xuXG4gICAgcmV0dXJuIHJlc291cmNlTW9kdWxlO1xuICB9XG59XG4iXX0=